home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / keybindingDialog.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  12KB  |  285 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''
  5. Dialog for building Tkinter accelerator key bindings
  6. '''
  7. from Tkinter import *
  8. import tkMessageBox
  9. import string
  10. import os
  11.  
  12. class GetKeysDialog(Toplevel):
  13.     
  14.     def __init__(self, parent, title, action, currentKeySequences):
  15.         '''
  16.         action - string, the name of the virtual event these keys will be
  17.                  mapped to
  18.         currentKeys - list, a list of all key sequence lists currently mapped
  19.                  to virtual events, for overlap checking
  20.         '''
  21.         Toplevel.__init__(self, parent)
  22.         self.configure(borderwidth = 5)
  23.         self.resizable(height = FALSE, width = FALSE)
  24.         self.title(title)
  25.         self.transient(parent)
  26.         self.grab_set()
  27.         self.protocol('WM_DELETE_WINDOW', self.Cancel)
  28.         self.parent = parent
  29.         self.action = action
  30.         self.currentKeySequences = currentKeySequences
  31.         self.result = ''
  32.         self.keyString = StringVar(self)
  33.         self.keyString.set('')
  34.         self.SetModifiersForPlatform()
  35.         self.modifier_vars = []
  36.         for modifier in self.modifiers:
  37.             variable = StringVar(self)
  38.             variable.set('')
  39.             self.modifier_vars.append(variable)
  40.         
  41.         self.advanced = False
  42.         self.CreateWidgets()
  43.         self.LoadFinalKeyList()
  44.         self.withdraw()
  45.         self.update_idletasks()
  46.         self.geometry('+%d+%d' % (parent.winfo_rootx() + (parent.winfo_width() / 2 - self.winfo_reqwidth() / 2), parent.winfo_rooty() + (parent.winfo_height() / 2 - self.winfo_reqheight() / 2)))
  47.         self.deiconify()
  48.         self.wait_window()
  49.  
  50.     
  51.     def CreateWidgets(self):
  52.         frameMain = Frame(self, borderwidth = 2, relief = SUNKEN)
  53.         frameMain.pack(side = TOP, expand = TRUE, fill = BOTH)
  54.         frameButtons = Frame(self)
  55.         frameButtons.pack(side = BOTTOM, fill = X)
  56.         self.buttonOK = Button(frameButtons, text = 'OK', width = 8, command = self.OK)
  57.         self.buttonOK.grid(row = 0, column = 0, padx = 5, pady = 5)
  58.         self.buttonCancel = Button(frameButtons, text = 'Cancel', width = 8, command = self.Cancel)
  59.         self.buttonCancel.grid(row = 0, column = 1, padx = 5, pady = 5)
  60.         self.frameKeySeqBasic = Frame(frameMain)
  61.         self.frameKeySeqAdvanced = Frame(frameMain)
  62.         self.frameControlsBasic = Frame(frameMain)
  63.         self.frameHelpAdvanced = Frame(frameMain)
  64.         self.frameKeySeqAdvanced.grid(row = 0, column = 0, sticky = NSEW, padx = 5, pady = 5)
  65.         self.frameKeySeqBasic.grid(row = 0, column = 0, sticky = NSEW, padx = 5, pady = 5)
  66.         self.frameKeySeqBasic.lift()
  67.         self.frameHelpAdvanced.grid(row = 1, column = 0, sticky = NSEW, padx = 5)
  68.         self.frameControlsBasic.grid(row = 1, column = 0, sticky = NSEW, padx = 5)
  69.         self.frameControlsBasic.lift()
  70.         self.buttonLevel = Button(frameMain, command = self.ToggleLevel, text = 'Advanced Key Binding Entry >>')
  71.         self.buttonLevel.grid(row = 2, column = 0, stick = EW, padx = 5, pady = 5)
  72.         labelTitleBasic = Label(self.frameKeySeqBasic, text = "New keys for  '" + self.action + "' :")
  73.         labelTitleBasic.pack(anchor = W)
  74.         labelKeysBasic = Label(self.frameKeySeqBasic, justify = LEFT, textvariable = self.keyString, relief = GROOVE, borderwidth = 2)
  75.         labelKeysBasic.pack(ipadx = 5, ipady = 5, fill = X)
  76.         self.modifier_checkbuttons = { }
  77.         column = 0
  78.         for modifier, variable in zip(self.modifiers, self.modifier_vars):
  79.             label = self.modifier_label.get(modifier, modifier)
  80.             check = Checkbutton(self.frameControlsBasic, command = self.BuildKeyString, text = label, variable = variable, onvalue = modifier, offvalue = '')
  81.             check.grid(row = 0, column = column, padx = 2, sticky = W)
  82.             self.modifier_checkbuttons[modifier] = check
  83.             column += 1
  84.         
  85.         labelFnAdvice = Label(self.frameControlsBasic, justify = LEFT, text = 'Select the desired modifier keys\n' + 'above, and the final key from the\n' + 'list on the right.\n\n' + 'Use upper case Symbols when using\n' + 'the Shift modifier.  (Letters will be\n' + 'converted automatically.)')
  86.         labelFnAdvice.grid(row = 1, column = 0, columnspan = 4, padx = 2, sticky = W)
  87.         self.listKeysFinal = Listbox(self.frameControlsBasic, width = 15, height = 10, selectmode = SINGLE)
  88.         self.listKeysFinal.bind('<ButtonRelease-1>', self.FinalKeySelected)
  89.         self.listKeysFinal.grid(row = 0, column = 4, rowspan = 4, sticky = NS)
  90.         scrollKeysFinal = Scrollbar(self.frameControlsBasic, orient = VERTICAL, command = self.listKeysFinal.yview)
  91.         self.listKeysFinal.config(yscrollcommand = scrollKeysFinal.set)
  92.         scrollKeysFinal.grid(row = 0, column = 5, rowspan = 4, sticky = NS)
  93.         self.buttonClear = Button(self.frameControlsBasic, text = 'Clear Keys', command = self.ClearKeySeq)
  94.         self.buttonClear.grid(row = 2, column = 0, columnspan = 4)
  95.         labelTitleAdvanced = Label(self.frameKeySeqAdvanced, justify = LEFT, text = "Enter new binding(s) for  '" + self.action + "' :\n" + '(These bindings will not be checked for validity!)')
  96.         labelTitleAdvanced.pack(anchor = W)
  97.         self.entryKeysAdvanced = Entry(self.frameKeySeqAdvanced, textvariable = self.keyString)
  98.         self.entryKeysAdvanced.pack(fill = X)
  99.         labelHelpAdvanced = Label(self.frameHelpAdvanced, justify = LEFT, text = 'Key bindings are specified using Tkinter keysyms as\n' + 'in these samples: <Control-f>, <Shift-F2>, <F12>,\n<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.\nUpper case is used when the Shift modifier is present!\n\n' + "'Emacs style' multi-keystroke bindings are specified as\n" + 'follows: <Control-x><Control-y>, where the first key\n' + "is the 'do-nothing' keybinding.\n\n" + 'Multiple separate bindings for one action should be\n' + 'separated by a space, eg., <Alt-v> <Meta-v>.')
  100.         labelHelpAdvanced.grid(row = 0, column = 0, sticky = NSEW)
  101.  
  102.     
  103.     def SetModifiersForPlatform(self):
  104.         """Determine list of names of key modifiers for this platform.
  105.  
  106.         The names are used to build Tk bindings -- it doesn't matter if the
  107.         keyboard has these keys, it matters if Tk understands them. The
  108.         order is also important: key binding equality depends on it, so
  109.         config-keys.def must use the same ordering.
  110.         """
  111.         import sys as sys
  112.         if sys.platform == 'darwin' and sys.argv[0].count('.app'):
  113.             self.modifiers = [
  114.                 'Shift',
  115.                 'Control',
  116.                 'Option',
  117.                 'Command']
  118.         else:
  119.             self.modifiers = [
  120.                 'Control',
  121.                 'Alt',
  122.                 'Shift']
  123.         self.modifier_label = {
  124.             'Control': 'Ctrl' }
  125.  
  126.     
  127.     def ToggleLevel(self):
  128.         if self.buttonLevel.cget('text')[:8] == 'Advanced':
  129.             self.ClearKeySeq()
  130.             self.buttonLevel.config(text = '<< Basic Key Binding Entry')
  131.             self.frameKeySeqAdvanced.lift()
  132.             self.frameHelpAdvanced.lift()
  133.             self.entryKeysAdvanced.focus_set()
  134.             self.advanced = True
  135.         else:
  136.             self.ClearKeySeq()
  137.             self.buttonLevel.config(text = 'Advanced Key Binding Entry >>')
  138.             self.frameKeySeqBasic.lift()
  139.             self.frameControlsBasic.lift()
  140.             self.advanced = False
  141.  
  142.     
  143.     def FinalKeySelected(self, event):
  144.         self.BuildKeyString()
  145.  
  146.     
  147.     def BuildKeyString(self):
  148.         keyList = modifiers = self.GetModifiers()
  149.         finalKey = self.listKeysFinal.get(ANCHOR)
  150.         if finalKey:
  151.             finalKey = self.TranslateKey(finalKey, modifiers)
  152.             keyList.append(finalKey)
  153.         
  154.         self.keyString.set('<' + string.join(keyList, '-') + '>')
  155.  
  156.     
  157.     def GetModifiers(self):
  158.         modList = [ variable.get() for variable in self.modifier_vars ]
  159.         return filter(None, modList)
  160.  
  161.     
  162.     def ClearKeySeq(self):
  163.         self.listKeysFinal.select_clear(0, END)
  164.         self.listKeysFinal.yview(MOVETO, '0.0')
  165.         for variable in self.modifier_vars:
  166.             variable.set('')
  167.         
  168.         self.keyString.set('')
  169.  
  170.     
  171.     def LoadFinalKeyList(self):
  172.         self.functionKeys = ('F1', 'F2', 'F2', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12')
  173.         self.alphanumKeys = tuple(string.ascii_lowercase + string.digits)
  174.         self.punctuationKeys = tuple('~!@#%^&*()_-+={}[]|;:,.<>/?')
  175.         self.whitespaceKeys = ('Tab', 'Space', 'Return')
  176.         self.editKeys = ('BackSpace', 'Delete', 'Insert')
  177.         self.moveKeys = ('Home', 'End', 'Page Up', 'Page Down', 'Left Arrow', 'Right Arrow', 'Up Arrow', 'Down Arrow')
  178.         keys = self.alphanumKeys + self.punctuationKeys + self.functionKeys + self.whitespaceKeys + self.editKeys + self.moveKeys
  179.         self.listKeysFinal.insert(END, *keys)
  180.  
  181.     
  182.     def TranslateKey(self, key, modifiers):
  183.         '''Translate from keycap symbol to the Tkinter keysym'''
  184.         translateDict = {
  185.             'Space': 'space',
  186.             '~': 'asciitilde',
  187.             '!': 'exclam',
  188.             '@': 'at',
  189.             '#': 'numbersign',
  190.             '%': 'percent',
  191.             '^': 'asciicircum',
  192.             '&': 'ampersand',
  193.             '*': 'asterisk',
  194.             '(': 'parenleft',
  195.             ')': 'parenright',
  196.             '_': 'underscore',
  197.             '-': 'minus',
  198.             '+': 'plus',
  199.             '=': 'equal',
  200.             '{': 'braceleft',
  201.             '}': 'braceright',
  202.             '[': 'bracketleft',
  203.             ']': 'bracketright',
  204.             '|': 'bar',
  205.             ';': 'semicolon',
  206.             ':': 'colon',
  207.             ',': 'comma',
  208.             '.': 'period',
  209.             '<': 'less',
  210.             '>': 'greater',
  211.             '/': 'slash',
  212.             '?': 'question',
  213.             'Page Up': 'Prior',
  214.             'Page Down': 'Next',
  215.             'Left Arrow': 'Left',
  216.             'Right Arrow': 'Right',
  217.             'Up Arrow': 'Up',
  218.             'Down Arrow': 'Down',
  219.             'Tab': 'Tab' }
  220.         if key in translateDict.keys():
  221.             key = translateDict[key]
  222.         
  223.         if 'Shift' in modifiers and key in string.ascii_lowercase:
  224.             key = key.upper()
  225.         
  226.         key = 'Key-' + key
  227.         return key
  228.  
  229.     
  230.     def OK(self, event = None):
  231.         if self.advanced or self.KeysOK():
  232.             self.result = self.keyString.get()
  233.             self.destroy()
  234.         
  235.  
  236.     
  237.     def Cancel(self, event = None):
  238.         self.result = ''
  239.         self.destroy()
  240.  
  241.     
  242.     def KeysOK(self):
  243.         """Validity check on user's 'basic' keybinding selection.
  244.  
  245.         Doesn't check the string produced by the advanced dialog because
  246.         'modifiers' isn't set.
  247.  
  248.         """
  249.         keys = self.keyString.get()
  250.         keys.strip()
  251.         finalKey = self.listKeysFinal.get(ANCHOR)
  252.         modifiers = self.GetModifiers()
  253.         keySequence = keys.split()
  254.         keysOK = False
  255.         title = 'Key Sequence Error'
  256.         if not keys:
  257.             tkMessageBox.showerror(title = title, parent = self, message = 'No keys specified.')
  258.         elif not keys.endswith('>'):
  259.             tkMessageBox.showerror(title = title, parent = self, message = 'Missing the final Key')
  260.         elif not modifiers and finalKey not in self.functionKeys + self.moveKeys:
  261.             tkMessageBox.showerror(title = title, parent = self, message = 'No modifier key(s) specified.')
  262.         elif modifiers == [
  263.             'Shift'] and finalKey not in self.functionKeys + self.moveKeys + ('Tab', 'Space'):
  264.             msg = 'The shift modifier by itself may not be used with this key symbol.'
  265.             tkMessageBox.showerror(title = title, parent = self, message = msg)
  266.         elif keySequence in self.currentKeySequences:
  267.             msg = 'This key combination is already in use.'
  268.             tkMessageBox.showerror(title = title, parent = self, message = msg)
  269.         else:
  270.             keysOK = True
  271.         return keysOK
  272.  
  273.  
  274. if __name__ == '__main__':
  275.     root = Tk()
  276.     
  277.     def run():
  278.         keySeq = ''
  279.         dlg = GetKeysDialog(root, 'Get Keys', 'find-again', [])
  280.         print dlg.result
  281.  
  282.     Button(root, text = 'Dialog', command = run).pack()
  283.     root.mainloop()
  284.  
  285.